home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / C7.TXT < prev    next >
Text File  |  1996-07-05  |  11KB  |  307 lines

  1. C Dili - 7. Konu
  2.  
  3. KELIME KATARI (STRING) NEDIR?
  4.  
  5. Bir katar, genellikle harflerden olusan karakterler dizisidir. Ciktinizin
  6. guzel ve manali gorunmesi icin, icinde isimler ve adresler olabilmesi
  7. icin, programlarinizin katarlar kullanmasi sarttir. C dilinde tam tanimi,
  8. "char" tipi bilgilerin, NULL karakter (yani sifir) ile sonlandirilmasidir.
  9.  
  10. C bir katari karsilastiracagi, kopyalayacagi yada ekrana yansitacagi
  11. zaman, bunlari gerceklestiren fonksiyonlar, NULL gorunene dek bu islemi
  12. yapmak uzere programlanmistir.
  13.  
  14. ARRAY (dizi) NEDIR?
  15.  
  16. dizi, ayni tip verilerin birbiri arkasina tanimlanmasidir. Kelime katari,
  17. bir cins dizidir. 
  18.  
  19. CHRSTRG.C:
  20. ================================================================
  21.  
  22. main()
  23. {
  24. char isim[7];       /* Bir karakter dizisi tanimlayalim */
  25.  
  26.    isim[0] = 'T';
  27.    isim[1] = 'u';
  28.    isim[2] = 'r';
  29.    isim[3] = 'g';
  30.    isim[4] = 'u';
  31.    isim[5] = 't';
  32.    isim[6] = 0;     /* Bos karakter - katarin sonu  */
  33.  
  34.    printf("Isim %s dur. \n",isim);
  35.    printf("Icinden bir karakter: %c\n",isim[2]);
  36.    printf("Ismin bir parcasi: %s \n",&isim[3]);
  37. }
  38.  
  39. ================================================================
  40.  
  41. Bu programda, ilk once, "char" tipi bir tanimlama goruyoruz. Koseli
  42. parantezler icinde, kac hanelik bir dizi tanimlanacagini belirtiyoruz. C
  43. dilinde butun diziler sifirdan basladigi icin, bu tanimlama ile
  44. kullanabilecegimiz en yuksek index degeri 6 dir. 
  45.  
  46. KATAR NASIL KULLANILIR
  47.  
  48. Demek ki, "isim" degiskeni, icinde 7 tane karakter tutabilir. Fakat en son
  49. karakterin sifir olmasi zorunlugu oldugu icin, kullanilabilecek olan alan
  50. 6 karakterliktir. Bu katarin icine manali birsey yuklemek icin, yedi tane
  51. komut veriyoruz - her biri, katara bir karakter atamaktadir. En sonunda
  52. da, katarin sonunu belirten sifir rakamini koyuyoruz. (Bir "#define" ile
  53. NULL karakteri, programin basinda sifir olarak tanimlayabiliriz.)
  54.  
  55. printf komutundaki %s isareti, printf'e "isim" isimli katardan, sifira
  56. rastlayincaya kadar ekrana yazmasini belirtir. Dikkat etmeniz gereken bir
  57. nokta, "isim" degiskeninin indexinin yazilmasinin gerekmedigidir.
  58.  
  59. KATARIN BIR KISMININ YAZILMASI
  60.  
  61. Ikinci printf komutu ise %c ile, katarin icinden sadece bir karakter
  62. (harf) yazilmasini gosterir. Istedigimiz karakterin index numarasini da,
  63. "isim" degiskeninin yanina, koseli parantezler arasinda gosterebiliriz. 
  64.  
  65. Son printf komutunda ise, katarin 4. karakterinden itibaren yazmanin bir
  66. ornegidir. "isim" degiskeninin onundeki & (ampersand) isareti, isim[3]'un
  67. hafizada saklandigi adresin printf'e gecirilmesini belirtir. Adresleri 8.
  68. konuda gorecegiz, fakat ufak bir ornek ile size bizleri nelerin
  69. bekledigini gostermek istedim.
  70.  
  71. BAZI KATAR FONKSIYONLARI
  72.  
  73. KATAR.C
  74. ================================================================
  75.  
  76. main()
  77. {
  78. char isim1[12],isim2[12],karisik[25];
  79. char baslik[20];
  80.  
  81.    strcpy(isim1,"Rosalinda");
  82.    strcpy(isim2,"Zeke");
  83.    strcpy(baslik,"Bu bir basliktir.");
  84.  
  85.    printf("     %s\n\n",baslik);
  86.    printf("isim 1:  %s \n",isim1);
  87.    printf("isim 2:  %s \n",isim2);
  88.  
  89.    if(strcmp(isim1,isim2)>0)  /* sayet isim1 > isim2 ise, 1 dondurur */
  90.       strcpy(karisik,isim1);
  91.    else
  92.       strcpy(karisik,isim2);
  93.  
  94.    printf("Alfabetik olarak en buyuk isim %s dir.\n",karisik);
  95.  
  96.    strcpy(karisik,isim1);
  97.    strcat(karisik,"  ");
  98.    strcat(karisik,isim2);
  99.    printf("Iki isim birden %s\n",karisik);
  100. }
  101. ================================================================
  102. Ilk once 4 tane katar tanimliyoruz. Daha sonra, "strcpy" isimli cok pratik
  103. bir fonksiyona geliyoruz. Yaptigi is, bir katari, bir digerine, ta ki
  104. sifir bulunana kadar kopyalamak.  Hangi katarin hangisine kopyalancagini
  105. hatirlamak icin, bir atama komutunu dusunun ("x=23" gibi). Veri,
  106. sagdakinden, soldakine kopyalanir. Bu komutun yapilmasindan sonra, isim1
  107. in icinde, "Rosalinda" olacaktir - den-densiz olarak.  Den-denler,
  108. derleyicinin sizin bir katar tanimladiginizi anlamasi icin gereklidir. 
  109.  
  110. KATARLARIN ALFABETIK OLARAK SIRAYA KONMASI
  111.  
  112. Ilginizi cekebilecek diger bir fonksiyonda, "strcmp" dur. Sayet kendisine
  113. gecirilen birinci katar ikinciden daha buyukse, 1 dondurur, ayni ise 0, ve
  114. ikinci daha buyukse -1 dondurur. "Zeke" katarinin kazanmasi, sizi herhalde
  115. sasirtmaz. Burada katarin boyu onemli degildir, sadece icindeki
  116. karakterler. Ayrica harflerin buyuk yada kucuk harf olmasi da fark
  117. ettirir. C de bir katarin butun harflerini kucuk yada buyuge ceviren
  118. fonksiyonlar da vardir. Bunlari daha ileri kullanacagiz. 
  119.  
  120. KATARLARI BIRBIRINE EKLEMEK
  121.  
  122. En son satirda, "strcat" isimli yeni bir fonksiyon goreceksiniz. Gorevi,
  123. bir katarin sonuna diger katari eklemektir. Bunu yaparken NULL karakterin
  124. de yerli yerinde olmasini saglar. Burada, "isim1", "karisik" 'a
  125. kopyalanir, daha sonra "karisik" a iki bosluk ve "isim2" eklenir. 
  126.  
  127. Katarlar zor degildir, ve son derece faydalidirlar. Onlari kullanmayi
  128. iyice ogrenmenizde fayda vardir. 
  129.  
  130.  
  131. BIR TAMSAYI DIZISI
  132.  
  133. INTDIZIN.C:
  134. ================================================================
  135. main()
  136. {
  137. int degerler[12];
  138. int index;
  139.  
  140.    for (index = 0;index < 12;index++)  
  141.       degerler[index] = 2 * (index + 4);
  142.  
  143.    for (index = 0;index < 12;index++)
  144.       printf("Index = %2d deki degeri %3d dir..\n",index,degerler[index]);
  145.  
  146. }
  147. ================================================================
  148.  
  149. Bu programda, bir tamsayi dizisi tanimliyoruz. Gordugunuz gibi, ayni katar
  150. tanimlama gibi.. Bu sayede, index degiskeni haric oniki tane degiskenimiz
  151. oluyor. Bu degiskenlerin isimleri "degerler[0]" , "degerler[1]" ,vs. dir.
  152. Ilk "for" dongusunde, bunlara deger atiyoruz, ikincisi ise, index
  153. degiskeni ve "degerler" dizisinin icindekileri ekrana yaziyor. 
  154.  
  155. BIR KAYAR NOKTA DIZINI
  156.  
  157. BUYUKDIZ.C:
  158. ================================================================
  159. char isim1[] = "Birinci Program basligi";
  160.  
  161. main()
  162. {
  163. int index;
  164. int ivir[12];
  165. float tuhaf[12];
  166. static char isim2[] = "Ikinci Program Basligi";
  167.  
  168.    for (index = 0;index < 12;index++) {
  169.       ivir[index] = index + 10;
  170.       tuhaf[index] = 12.0 * (index + 7);
  171.    }
  172.  
  173.    printf("%s\n",isim1);
  174.    printf("%s\n\n",isim2);
  175.    for (index = 0;index < 12;index++)
  176.       printf("%5d %5d %10.3f\n",index,ivir[index],tuhaf[index]);
  177. }
  178. ================================================================
  179.  
  180. Burada, "float" olarak tanimli bir kayar nokta dizisi goruyorsunuz.
  181. Ayrica bu program, katarlara nasil baslangic degeri atanabilecegini
  182. gosteriyor. Koseli parantezlerin icini bos birakarak, derleyicinin o
  183. veriyi saklamak icin yeteri kadar yer ayarlamasini sagladik. Programin
  184. icinde, bir katar daha ilk degerini veriyoruz. Burada onune "static"
  185. koymak zorunlugumuz var. Baska yeni birsey yok bu programda. Degiskenler
  186. rastgele degerlere atanir, ve sonra da bu degerler ekrana yazdirilir. 
  187.  
  188.  
  189. BIR FONKSIYONDAN DEGER DONDURME
  190.  
  191. GERIDOND.C:
  192. ================================================================
  193. main()
  194. {
  195. int index;
  196. int matrix[20];
  197.  
  198.    for (index = 0;index < 20;index++)              /* veriyi uretelim */
  199.       matrix[index] = index + 1;
  200.  
  201.    for (index = 0;index < 5;index++)         /* orjinal veriyi, ekrana. */
  202.       printf("Baslangic   matrix[%d] = %d\n",index,matrix[index]);
  203.  
  204.    yapbirsey(matrix);              /* fonksiyona gidip, deger degistirme */
  205.  
  206.    for (index = 0;index < 5;index++)       /* degismis matrix i yazalim  */
  207.       printf("Geri donen  matrix[%d] = %d\n",index,matrix[index]);
  208.  
  209. yapbirsey(list)                 /* Veri donusunu gosterir */
  210. int list[];
  211. {
  212. int i;
  213.  
  214.    for (i = 0;i < 5;i++)                   /* print original matrix */ 
  215.       printf("Onceki  matrix[%d] = %d\n",i,list[i]);
  216.  
  217.    for (i = 0;i < 20;i++)                   /* add 10 to all values */
  218.       list[i] += 10;
  219.  
  220.    for (i = 0;i < 5;i++)                   /* print modified matrix */
  221.       printf("Sonraki matrix[%d] = %d\n",i,list[i]);
  222. }
  223. ================================================================
  224.  
  225. Bir fonksiyondan deger dondurmenin bir yolu da, diziler kullanmaktir. 
  226. Buradam 20 hanelik bir dizi tanimladiktan sonra, icine degerler atiyoruz,
  227. bu degerlerin ilk besini ekrana yazdiktan sonra, "yapbirsey" isimli
  228. fonksiyona atliyoruz. Burada goreceginiz gibi, bu fonksiyon "matrix"
  229. isimli diziye "list" demeyi tercih ediyor. Fonksiyona, ne cins bir dizi
  230. gececegini bildirmek icin, "int" olarak "list"i tanimliyoruz. Fonksiyona
  231. kac elemanlik bir dizi gecegini soylememize luzum yok, fakat istenirse
  232. belirtilebilir. Bu nedenle bos koseli parantezler kullaniyoruz. 
  233.  
  234. Bu fonksiyon da, kendisine gecen degerleri gosterdikten sonra, bu
  235. degerlere 10 ekliyor, ve yeni degerleri gosterip, ana programa geri
  236. donuyor. Ana programda goruyoruz ki, fonksiyonun yaptigi degisiklikler,
  237. "matrix" degerlerini de degistirmis. 
  238.  
  239. Dizilerin, normal degiskenlerin aksine, fonksiyondaki degerleri degisince,
  240. cagiran programdaki dizinin degerlerinin degismesini garipsiyebilirsiniz.
  241. Pointerlar konusuna gelince butun bunlar daha manali olacaktir. 
  242.  
  243. BIRDEN FAZLA BOYUTLU DIZILER
  244.  
  245. COKLUDIZ.C:
  246. ================================================================
  247. main()
  248. {
  249. int i,j;
  250. int buyuk[8][8],dev[25][12];
  251.  
  252.    for (i = 0;i < 8;i++)
  253.       for (j = 0;j < 8;j++)
  254.          buyuk[i][j] = i * j;       /* Bu bir carpim tablosudur */
  255.  
  256.    for (i = 0;i < 25;i++)
  257.       for (j = 0;j < 12;j++)
  258.          dev[i][j] = i + j;     /* Bu da bir toplama tablosudur */
  259.  
  260.    buyuk[2][6] = dev[24][10]*22;
  261.    buyuk[2][2] = 5;
  262.    buyuk[buyuk[2][2]][buyuk[2][2]] = 177;  /* bu,  buyuk[5][5] = 177; demek */
  263.  
  264.    for (i = 0;i < 8;i++) {
  265.       for (j = 0;j < 8;j++)
  266.          printf("%5d ",buyuk[i][j]);
  267.       printf("\n");               /* Her i nin degeri artinca, bir RETURN */
  268.    }
  269. }
  270. ================================================================
  271.  
  272. Burada iki tane iki boyutlu dizi kullaniyoruz. "buyuk" adli 8 e 8 lik
  273. dizinin elemanlari [0][0] dan [7][7] ye kadar, toplam 64 tanedir. Diger
  274. tanimli "dev" dizi ise, kare degildir, fakat dizinin kare olmasinin sart
  275. olmadigini gosteren bir ornektir. 
  276.  
  277. Iki dizi de biri carpim tablosu, digeri de toplama tablosu ile doldurulur.
  278.  
  279. Dizi elemanlarinin tek tek degistirilebilecegini gostermek icin, once
  280. "buyuk" un elemanlarinda birine, "dev" in bir elemani ile, 22 ile
  281. carpildiktan sonra atanir. Ikinci atamada ise, "buyuk[2][2]" elemani 5
  282. degerine atanir. Herhangi bir islemin index olarak kullanilabilecegini
  283. gosteren ucuncu atama ise, aslinda "big[5][5] = 177;" dir.
  284.  
  285. ODEVLER
  286.  
  287. 1. Herbiri yaklasik 6 karakter uzunlugunda uc kisa katarin icine "strcpy"
  288. ile iclerine "bir", "iki" ve "dort" kelimelerini kopyalayan bir program
  289. yazin. Daha sonra, bu katarlari, daha buyuk bir katarin icine, uc kelimeyi
  290. bir araya getirerek yerlestirin. Cikan sonucu on kere ekrana yazdirin.
  291.  
  292. 2. Herbiri 10 elemanli olan "dizi1" ve "dizi2" isimli iki tamsayi dizisi
  293. tanimlayin, ve iclerine bir dongu ile, ivir zivir bilgi doldurun. Daha
  294. sonra her bir elemanini, ayni boydaki bir baska diziye ekleyin. Bu cikan
  295. sonucu da "diziler" isimli 3. bir diziye atayin. Sonuclari ekrana
  296. yazdirin: 
  297.  
  298. 1   2  +  10  = 12
  299. 2   4  +  20  = 34
  300. 3   6  +  30  = 36   gibi..
  301.  
  302. Ipucu: printf komutu soyle gorunecek:
  303.     printf("%4d %4d + %4d = %4d\n",index,dizi1[index],dizi2[index],
  304.             diziler[index]);
  305.     
  306.